import CryptoJS from 'crypto-js';

/** AES 加解密工具类，支持通过参数传递密钥和初始向量 */
class AESUtil {
  /** 默认加密密钥（如未传递则使用此密钥） */
  private static readonly DEFAULT_SECRET_KEY = 'h-news-default-key-123';
  /** 当前全局加密密钥（可通过 setSecretKey 动态设置） */
  private static secretKey: string | undefined;
  /**
   * 设置全局加密密钥
   *
   * @param secretKey 新的密钥字符串
   */
  public static setSecretKey(secretKey: string): void {
    AESUtil.secretKey = secretKey;
  }
  /**
   * 加密字符串数据
   *
   * @param data 需要加密的字符串
   * @param secretKey 加密密钥（可选，未传递则使用默认密钥）
   * @param iv 初始向量（可选，默认自动生成）
   * @returns 加密后的字符串
   */
  static encrypt(data: string, secretKey?: string, iv?: CryptoJS.lib.WordArray): string {
    try {
      const usedKey = secretKey ?? AESUtil.secretKey ?? AESUtil.DEFAULT_SECRET_KEY;
      const usedIv = iv ?? CryptoJS.lib.WordArray.random(16);
      const encrypted = CryptoJS.AES.encrypt(data, usedKey, { iv: usedIv });
      // 返回 IV + 加密内容，便于解密时还原
      return `${usedIv.toString(CryptoJS.enc.Hex)}:${encrypted.toString()}`;
    } catch (error) {
      console.error('AES encryption failed:', error);
      return '';
    }
  }
  /**
   * 解密字符串数据
   *
   * @param encryptedData 加密后的字符串（格式：iv:密文）
   * @param secretKey 解密密钥（可选，未传递则使用默认密钥）
   * @returns 解密后的原始字符串
   */
  static decrypt(encryptedData: string, secretKey?: string): string {
    try {
      const [ivHex, cipherText] = encryptedData.split(':');
      if (!ivHex || !cipherText) return '';
      const iv = CryptoJS.enc.Hex.parse(ivHex);
      const usedKey = secretKey ?? AESUtil.secretKey ?? AESUtil.DEFAULT_SECRET_KEY;
      const bytes = CryptoJS.AES.decrypt(cipherText, usedKey, { iv });
      return bytes.toString(CryptoJS.enc.Utf8);
    } catch (error) {
      console.error('AES decryption failed:', error);
      return '';
    }
  }
}

export default AESUtil;
